package com.atguigu.java;

import org.junit.Test;

import java.util.*;

/**
 *
 * 泛型的使用
 * 1.jdk 5.0新增特性
 *
 * 2.在集合中使用泛型
 *  总结：
 *  ①集合接口或集合类在jdk5.0时都修改为带泛型的结构
 *  ②在实例化接口类时，可以指明具体的泛型类型
 *  ③在指明完以后。在集合类或接口中凡是定义类或接口时，内部结构（比如：方法、构造器属性等）使用到泛型的位置，都指定为实例化的泛型类型
 *  比如：add(E e) -----> 实例化以后：add(Integer e)
 *  ④注意点：泛型的类型必须是类，不是基本数据类型，而是包装类
 *  ⑤如果实例化时没有指明泛型的类型，那默认为java.lang.Object类型
 *
 * 3.如何自定义泛型结构：泛型类、泛型接口、泛型方法:见GenericTest1
 *
 */
public class GenericTest {

    //在集合中使用泛型之前的情况
    @Test
    public void test1(){
        ArrayList list = new ArrayList();
        //需求：存放学生成绩
        list.add(78);
        list.add(65);
        list.add(89);
        list.add(88);
        //问题一：类型不安全
//        list.add("Tom");

        for(Object score : list){
            //问题二：强转时，可能出现ClassCastException
            int studentScore = (int) score;

            System.out.println(studentScore);
        }
    }
    //在集合中使用泛型的情况
    //声明泛型不可以用基本数据类型，要使用对应的包装类
    @Test
    public void test2(){
        ArrayList<Integer> list = new ArrayList<Integer>();

        list.add(78);
        list.add(87);
        list.add(99);
        list.add(65);
        //编译时，就会进行安全检查，保证数据安全
//        list.add("123");

        //方式一：
//        for(Integer score : list){
//            //避免强转操作
//            int studentScore = score;
//            System.out.println(studentScore);
//        }

        //方式二：
        Iterator<Integer> iterator = list.iterator();
        while(iterator.hasNext()){
            Integer stuScore = iterator.next();
            System.out.println(stuScore);
        }
    }

    //在集合中使用泛型的情况：以HashMap为例
    @Test
    public void test3(){
        //String类型的key，int类型的value
        //jdk7新特性：类型推断 --->前面声明过泛型后，后面可以省略
        Map<String,Integer> map = new HashMap<String,Integer>();
        map.put("Tom",78);
        map.put("Jerry",87);
        map.put("Jack",67);

//        map.put(123,"ABC");
        //泛型的嵌套
        //Entry为Map中的内部类，在使用时需要先声明Map.
        Set<Map.Entry<String,Integer>> entry =  map.entrySet();
        Iterator<Map.Entry<String, Integer>> iterator = entry.iterator();

        while (iterator.hasNext()){
            Map.Entry<String, Integer> e = iterator.next();
            String key = e.getKey();
            Integer value = e.getValue();
            System.out.println(e.getKey() + "--->" + e.getValue());
        }
    }
}
